Skip to content

feat(desktop): add GitHub Copilot CLI harness - #6829

Open
nathanlutz wants to merge 2 commits into
block:mainfrom
nathanlutz:feat/copilot-cli-harness
Open

feat(desktop): add GitHub Copilot CLI harness#6829
nathanlutz wants to merge 2 commits into
block:mainfrom
nathanlutz:feat/copilot-cli-harness

Conversation

@nathanlutz

@nathanlutz nathanlutz commented Aug 25, 2026

Copy link
Copy Markdown

Summary - register GitHub Copilot CLI as a built-in ACP harness with official installation and login guidance - launch Copilot through its native --acp stdio mode while preserving required ACP arguments for custom configurations - surface model capabilities and authenticated readiness through Buzz's existing catalog, cache, and provider UI - add runtime, frontend, mock catalog, and screenshot coverage ## Validation - cargo check --target x86_64-pc-windows-msvc --manifest-path desktop/src-tauri/Cargo.toml --tests - node --test src/features/agents/ui/personaRuntimeModel.test.mjs - pnpm exec tsc --noEmit - pnpm exec biome check src/features/agents/ui/personaRuntimeModel.ts src/testing/e2eBridge.ts tests/e2e/harness-catalog-screenshots.spec.ts - pnpm build:e2e - pnpm exec playwright test tests/e2e/harness-catalog-screenshots.spec.ts --project=smoke - direct ACP initialize/session smoke test against GitHub Copilot CLI 1.0.81-9 Closes #3592

Screenshot

GitHub Copilot CLI ready in the Buzz harness catalog

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Signed-off-by: Nathan Lutz <me@nathanlutz.dev>
@nathanlutz
nathanlutz requested a review from a team as a code owner August 25, 2026 21:10

@Chessing234 Chessing234 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

registering copilot through its native --acp stdio mode rather than a third-party adapter is the right call, and the doc comment explaining why session/new + models is the readiness probe (no non-interactive status command, side-effect free) is the kind of note that stops someone "simplifying" it later.

a few things:

the avatar is the only unpinned one in the table.

const COPILOT_CLI_AVATAR_URL: &str = "https://github.com/github.png";

goose, claude code and codex all point at versioned CDN paths. this one is a redirect off github.com itself, resolved per render, so the harness catalog now makes a request to github.com whenever it draws that row — and it renders whatever github decides that avatar should be. avatars.githubusercontent.com/u/9919?s=200&v=4 is the stable form, or bundle it like the buzz-agent asset.

the auth probe's cost claim is an assumption about someone else's billing. "without spending a premium request" is true today and isn't something this repo can hold true. if copilot ever meters session/new or models, buzz starts silently consuming a user's quota every time the agents pane refreshes readiness. worth noting how often the probe runs (per catalog render? per app start? cached?) so the blast radius is visible if that assumption breaks — the cache is mentioned in the summary but the interval isn't.

Err(_) => AuthStatus::Unknown throws away the reason. the success-with-nonzero-exit path carefully classifies stderr into LoggedOut / ConfigInvalid with a diagnostic; the spawn-failure path collapses to Unknown with nothing recorded. "copilot isn't on PATH" and "copilot exists but exec failed" both land there, and the user gets an indeterminate state with no hint. even a tracing::debug! with the error would make it supportable.

the validation is windows-only. cargo check --target x86_64-pc-windows-msvc is the only compile listed, and cli_install_commands_windows is empty alongside cli_install_commands. common_binary_paths() and resolve_command are where a new runtime usually goes wrong per-platform (homebrew prefix on apple silicon vs intel, ~/.local/bin on linux), and none of that is exercised. a cargo check on at least one unix target, or a line saying CI covers it, would close that.

smaller: adapter_install_instructions_url: "" and adapter_install_hint: "" are empty strings rather than None while the neighbouring mcp_command and skill_dir use None/Option. worth checking the catalog ui doesn't render an empty "instructions" link for this row — an empty string is a value, and if url.is_empty() is easy to forget where if let Some(url) isn't.

and the VISION.md capitalisation change (goose, codex, claude code → title case) is unrelated to the feature. correct, but it's a second thing in the diff and it'll conflict with anything else touching that table.

Pin the GitHub avatar URL, document auth probe caching, log probe startup failures, and remove unrelated capitalization churn.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Signed-off-by: Nathan Lutz <nathanlutz@microsoft.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Allow for Github Copilot CLI as the coding harness

2 participants